//
//  TJJDefines.m
//  Light
//
//  Created by 石雄伟 on 15/12/19.
//  Copyright © 2015年 骁唐. All rights reserved.
//

#import "TJJDefines.h"

@implementation TJJDefines

//#pragma mark -- 获取两个经纬度之间的距离
//+(double)distanceBetweenOrderBy:(double)lat1 :(double)lat2 :(double)lng1 :(double)lng2{
//    CLLocation *curLocation = [[CLLocation alloc] initWithLatitude:lat1 longitude:lng1];
//    CLLocation *otherLocation = [[CLLocation alloc] initWithLatitude:lat2 longitude:lng2];
//    double distance  = [curLocation distanceFromLocation:otherLocation];
//    return distance;
//}
#pragma mark -- 十六进制颜色获取
+ (UIColor *)colorWithHexString:(NSString *)color
{
    NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    
    // String should be 6 or 8 characters
    if ([cString length] < 6) {
        return [UIColor clearColor];
    }
    
    // strip 0X if it appears
    if ([cString hasPrefix:@"0X"])
        cString = [cString substringFromIndex:2];
    if ([cString hasPrefix:@"#"])
        cString = [cString substringFromIndex:1];
    if ([cString length] != 6)
        return [UIColor clearColor];
    
    // Separate into r, g, b substrings
    NSRange range;
    range.location = 0;
    range.length = 2;
    
    //r
    NSString *rString = [cString substringWithRange:range];
    
    //g
    range.location = 2;
    NSString *gString = [cString substringWithRange:range];
    
    //b
    range.location = 4;
    NSString *bString = [cString substringWithRange:range];
    
    // Scan values
    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];
    
    return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f];
}

#pragma mark -
#pragma mark 邮箱验证
+(BOOL)isEmail:(NSString *)email
{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
    return [emailTest evaluateWithObject:email];
}

#pragma mark -
#pragma mark 手机号码验证
/*
 130~139  145,147 15[012356789] 180~189 176-8
 */
+(BOOL)isMobile:(NSString *)mobile
{
    //手机号以13，14，15，18，17开头，八个 \d 数字字符
    //    NSString *phoneRegex = @"^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57])[0-9]{8}$";
    NSString *phoneRegex = @"^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57]|17[0-9])[0-9]{8}$";
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
    return [phoneTest evaluateWithObject:mobile];
}
#pragma mark -
#pragma mark QQ验证
+(BOOL)isQQ:(NSString *)QQ
{
    NSString *emailRegex = @"[1-9][0-9]{4,}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
    return [emailTest evaluateWithObject:QQ];
}


#pragma mark 判断接收到的数据包是否符合规范
+ (BOOL)dataPacketIsCorrect:(NSString *)dataString{
    NSLog(@"需要判断的字符串为：%@",dataString);
    //判断 数据包 是否规范的函数，这个应该在接收包对应的协议方法里判断，
    if (dataString.length == 40 && [dataString hasPrefix:@"aa"])
        //[dataString containsString:@"aa"] 这个方法，是iOS8.0以后的方法，需要注意。
        //-[__NSCFConstantString containsString:]: unrecognized selector sent to instance 0x4c1c0
        
        //- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);
        //  - (BOOL)hasPrefix:(NSString *)str;
        //        - (BOOL)hasSuffix:(NSString *)str;
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

#pragma mark 数据包处理，返回6个数字  包括字符分割、格式转换（用位操做处理）等
+ (NSArray *)dataProcessing:(NSString *)dataPacketString
{
    NSMutableArray * mutableDataArray = [[NSMutableArray alloc] initWithCapacity:0];//存放数据
    //不能用AA或者aa进行分割，因为很有可能一个数据包中，数据中有以‘aa’的16进制的数据。
    NSMutableArray * mutableStringArray = [[NSMutableArray alloc] initWithCapacity:0];//存放切割后的string数据
    //添加第一段
    [mutableStringArray addObject:[self returnStringBySelf:dataPacketString AndIndex:2 AndLenght:18]];
    //添加第二段
    [mutableStringArray addObject:[self returnStringBySelf:dataPacketString AndIndex:22 AndLenght:18]];
    NSLog(@"分割后构成的数组：%@",mutableStringArray);
    
    for (NSString * string in mutableStringArray)
    {
        //每个字符串，包含18位，9个字节。3个数据点。
        if (string.length == 18)//只有18长度的字符串才是正确的格式，其他的都是错误的格式
        {
            for (int i=0; i < string.length-1; i+=6)//取字符串，从0开始，每6位取一次
            {
                NSString * tempString = [self returnStringBySelf:string AndIndex:i AndLenght:6];//取得单个数据点
                NSInteger dataIntergerValue = [self returnIntegerValue:tempString];//处理每个数据点，需要转换成整数
                [mutableDataArray addObject:[NSString stringWithFormat:@"%ld",dataIntergerValue]];//添加到可变数组中
            }
        }
        else
        {
            NSLog(@"切割数据发送错误");
        }
    }
    return mutableDataArray;//返回数据
}

#pragma mark 返回截取的字符串
+ (NSString *)returnStringBySelf:(NSString *)string AndIndex:(NSInteger)index AndLenght:(NSInteger)length
{// 返回截取的字符串，按照传过来的字符串，开始下标、截取长度
    NSString * tempString = [string substringWithRange:NSMakeRange(index, length)];//从第index位置取length长度
    return tempString;
}

#pragma mark 处理数据点（计算机数据点的具体值）
+ (NSInteger)returnIntegerValue:(NSString *)dataString
{
    //  处理数据点。之前是字符串标识的16进制格式的  如处理：ff0b2c
    //    unsigned char temp[20]; //无符号的
    uint32_t point;
    //    memset(temp, 0, 20);
    NSInteger sum = 0;
    for (int i = 0; i < dataString.length; i+=6)
    {
        long tmp;
        NSString * tempString = [dataString substringWithRange:NSMakeRange(i, 6)];
        tmp = strtol([tempString UTF8String], 0, 16);
        if (tmp&0x800000) {
            point = (uint32_t)tmp|0xFF000000;
        }
        else point = (uint32_t)tmp;
        NSLog(@"》》》》》》位操作打印结果：%d",point);
        NSString * string = [NSString stringWithFormat:@"%d",point];
        sum = [string integerValue];
    }
    
    //    for (int i = 0; i < dataString.length; i+=2)
    //    {
    //        NSString * tempString = [dataString substringWithRange:NSMakeRange(i, 2)];
    //        temp[i/2]=strtoul([tempString UTF8String], 0, 16);
    //        //每两位就是代表一个16进制的数
    //        NSLog(@"a[%d]对应的16进制的：%02x",i/2,temp[i/2]);//打印出无符号的
    //
    //        NSInteger tempInt = strtoul([tempString UTF8String], 0, 16);
    //        NSLog(@"a[%d]对应的整数:%ld",i/2,tempInt);
    //        switch (i/2) {
    //            case 0:
    //            {
    //                NSLog(@"a[0]*65336=第一个和：%ld",tempInt*65536);
    //                sum += tempInt*65536;
    //            }
    //                break;
    //            case 1:
    //            {
    //                NSLog(@"a[1]*256=第二个和：%ld",tempInt*256);
    //                sum += tempInt*256;
    //            }
    //                break;
    //            case 2:
    //            {
    //                NSLog(@"a[2] = 第三个和：%ld",tempInt);
    //                sum += tempInt;
    //            }
    //                break;
    //
    //            default:
    //                break;
    //        }
    //    }
    //    NSLog(@"a[0]+a[1]+a[2]= 单个数据为：%ld",sum);//总和
    //    //判断是否为负数，负数需要处理
    //    if (sum > 8388607)
    //    {
    //        sum = -1*(16777216-sum);
    //    }
    //    NSLog(@"单个数据最终为：%ld",sum);
    return sum;
}
#pragma mark -
#pragma mark 将指令转换为字符串，返回
+ (NSString *)dataToString:(CBCharacteristic *)characteristic
{
    const uint8_t * dat = characteristic.value.bytes;
    NSMutableString * mutableString = [[NSMutableString alloc] initWithCapacity:0];
    //        NSLog(@"接收：%s",dat);
    //        NSLog(@"22::::%x",dat[0]);
    for (int i = 0; i < characteristic.value.length; i++)
    {
        [mutableString appendString:[NSString stringWithFormat:@"%02x",dat[i]]];
    }
    NSLog(@"字符串为：%@",mutableString);
    return mutableString;
}
#pragma mark -
#pragma mark 判断对象是不是空串  是空就返回yes 
+(BOOL)isNull:(id)object
{
    // 判断是否为空串
    if ([object isEqual:[NSNull null]]) {
        return YES;
    }
    else if ([object isKindOfClass:[NSNull class]])
    {
        return YES;
    }
    else if (object==nil){
        return YES;
    }
    return NO;
}
#pragma mark -
#pragma mark 空串转换成字符串“ ”
+(NSString *)stringNull:(id)object
{
    if ([object isEqual:[NSNull null]]) {
        return @" ";
    }
    else if ([object isKindOfClass:[NSNull class]])
    {
        return @" ";
    }
    else if (object==nil){
        return @" ";
    }
    return object;//如果不是空串，直接返回该对象
}

#pragma mark -
#pragma 判断收到指令的意思
+(int)check_command:(NSData *)cmd
{
    return 0;
}

#pragma mark -
#pragma mark 时间不足两位的，转换成两位。 (如：8转换成08)
+(NSString *)stringTimeSinger:(NSString *)string
{
    if ([string intValue] < 10 && [string intValue] >= 0)
    {//0-9 之间的数，需要添加0，比如9-->09
        return [NSString stringWithFormat:@"0%d",[string intValue]];
    }
    else if ([string intValue] < 0 || [string intValue] >= 60)
    {//当时间小于0 或者 大于60 说明有其他错误。
        return @"00";
    }
    else
    {
        return string;
    }
}

#pragma mark -
#pragma mark 两位时间不足两位的，转换成两位。比如：8：9转换成08：09
+(NSString *)stringTimeDouble:(NSString *)string
{//需要兼容是英文状态下的“:”还是中文状态下的“：”。
    if ([TJJDefines isNull:string])
    {
        return @"00:00";
    }
    for (int i = 0; i < string.length-1; i++)
    {
        NSString * tempString = [string substringWithRange:NSMakeRange(i, 1)];
        if ([tempString isEqualToString:@":"])
        {//如果是英文状态下的冒号
            NSArray * arrayString = [string componentsSeparatedByString:@":"];
            NSString * stringOne;
            NSString * stringTwo;
            if ([arrayString[0] intValue] < 10 && [arrayString[0] intValue] >= 0)
            {//0-9 之间的数，需要添加0，比如9-->09
                stringOne= [NSString stringWithFormat:@"0%lu",[arrayString[0] integerValue]];
            }
            else if ([arrayString[0] intValue] < 0 || [arrayString[0] intValue] >= 60)
            {//当时间小于0 或者 大于60 说明有其他错误。
                stringOne = @"00";
            }
            else
            {
               stringOne = (NSString *)arrayString[0];
            }
            
            if ([arrayString[1] intValue] < 10 && [arrayString[1] intValue] >= 0)
            {//0-9 之间的数，需要添加0，比如9-->09
                stringTwo= [NSString stringWithFormat:@"0%lu",[arrayString[1] integerValue]];
            }
            else if ([arrayString[1] intValue] < 0 || [arrayString[1] intValue] >= 60)
            {//当时间小于0 或者 大于60 说明有其他错误。
                stringTwo = @"00";
            }
            else
            {
                stringTwo = (NSString *)arrayString[1];
            }
            return [NSString stringWithFormat:@"%@:%@",stringOne,stringTwo];
        }
        
        if ([tempString isEqualToString:@"："])
        {//如果是中文状态下的冒号
            NSArray * arrayString = [string componentsSeparatedByString:@"："];
            NSString * stringOne;
            NSString * stringTwo;
            if ([arrayString[0] intValue] < 10 && [arrayString[0] intValue] >= 0)
            {//0-9 之间的数，需要添加0，比如9-->09
                stringOne= [NSString stringWithFormat:@"0%lu",[arrayString[0] integerValue]];
            }
            else if ([arrayString[0] intValue] < 0 || [arrayString[0] intValue] >= 60)
            {//当时间小于0 或者 大于60 说明有其他错误。
                stringOne = @"00";
            }
            else
            {
                stringOne = arrayString[0];
            }
            
            if ([arrayString[1] intValue] < 10 && [arrayString[1] intValue] >= 0)
            {//0-9 之间的数，需要添加0，比如9-->09
                stringTwo= [NSString stringWithFormat:@"0%lu",[arrayString[1] integerValue]];
            }
            else if ([arrayString[1] intValue] < 0 || [arrayString[1] intValue] >= 60)
            {//当时间小于0 或者 大于60 说明有其他错误。
                stringTwo = @"00";
            }
            else
            {
                stringTwo = arrayString[1];
            }
            return [NSString stringWithFormat:@"%@:%@",stringOne,stringTwo];
        }
    }
    return @"00:00";//如果从这边走，说明传进来的字符串中没有冒号（中文或者英文）
}

#pragma mark -
#pragma mark 返回时间的后一天的日期  如：2016年01月05日--> 2016年01月06日
+(NSString *)stringDateNext:(NSString *)string
{
    return nil;
}

#pragma mark -
#pragma mark 返回时间的前一天的日期  如：2016年01月05日--> 2016年01月04日
+(NSString *)stringDatePRE:(NSString *)string
{
    return nil;
}
#pragma mark -
#pragma mark 获取当前时间的秒数，从1970开始
+(long long int)getTimeIntSince1970
{
    //方法二：
    NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
    long long int date = (long int)time;
    while (date <= 0)
    {//过滤掉取时间为0 或者负数
        NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
        date = (long long int)time;
    }
    return date;
}

#pragma mark -
#pragma mark 获取当前时间 当天的秒数（时分秒相加）
+(long long int)getTimeIntSince1970Current
{
    //方法一（获取到8区的时间）
    NSDate *date = [NSDate date];//获取当前时间
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    NSInteger unitFlags = NSYearCalendarUnit |
    NSMonthCalendarUnit |
    NSDayCalendarUnit |
    NSWeekdayCalendarUnit |
    NSHourCalendarUnit |
    NSMinuteCalendarUnit |
    NSSecondCalendarUnit;
    comps = [calendar components:unitFlags fromDate:date];
    int  myHour = (int)[comps hour];
    int  minute  = (int)[comps  minute];
    int mySec = (int)[comps second];
    long long int currentTimeInt = myHour * 3600 + minute *60 + mySec;
    return currentTimeInt;
}

#pragma mark -
#pragma mark 获取年月日 格式1 如：2016-01-07
+(NSString *)getDateTypeOne
{
    NSDate *date = [NSDate date];//获取当前时间
    NSDateFormatter  *dateformatter=[[NSDateFormatter alloc] init];
    [dateformatter setDateFormat:@"YYYY-MM-dd"];//设置格式
    NSString * locationString=[dateformatter stringFromDate:date];
    return locationString;
}


#pragma mark -
#pragma mark 获取年月日时分秒 格式1 如：2016-01-07 13:30:37
+(NSString *)getDateTimeTypeOne
{
    NSDate *date = [NSDate date];//获取当前时间
    NSDateFormatter *currentformatter = [[NSDateFormatter alloc] init];
    [currentformatter setDateFormat:@"YYY-MM-dd HH:mm:ss"];
    NSString * currentTime = [currentformatter stringFromDate:date];
    return currentTime;
}

#pragma mark -
#pragma mark 获取时分 格式1 如：13:30
+(NSString *)getTimeTypeOne
{
    NSDate *date = [NSDate date];//获取当前时间
    NSDateFormatter *currentformatter = [[NSDateFormatter alloc] init];
    [currentformatter setDateFormat:@"HH:mm"];
    NSString * currentTime = [currentformatter stringFromDate:date];
    return currentTime;
    //方法二
//    NSDate *date = [NSDate date];
//    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//    NSDateComponents *comps = [[NSDateComponents alloc] init];
//    NSInteger unitFlags = NSYearCalendarUnit |
//    NSMonthCalendarUnit |
//    NSDayCalendarUnit |
//    NSWeekdayCalendarUnit |
//    NSHourCalendarUnit |
//    NSMinuteCalendarUnit |
//    NSSecondCalendarUnit;
//    comps = [calendar components:unitFlags fromDate:date];
//    NSInteger hour = [comps hour];
//    NSInteger minute = [comps minute];
//    NSString * dateTime = [NSString stringWithFormat:@"%lu:%lu",hour,minute];
//    return  dateTime;
}

#pragma mark -
#pragma mark 获取当天的星期，如：周日
+ (NSString *)getStringWeekday
{
    NSDate *  senddate=[NSDate date];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    NSInteger unitFlags = NSYearCalendarUnit |
    NSMonthCalendarUnit |
    NSDayCalendarUnit |
    NSWeekdayCalendarUnit |
    NSHourCalendarUnit |
    NSMinuteCalendarUnit |
    NSSecondCalendarUnit;
    comps = [calendar components:unitFlags fromDate:senddate];
    NSInteger week = [comps weekday];
    //TODO:标记时间设置问题
    
    switch (week) {//self.weekToday  week
        case 1:
            return  @"周日";
            break;
        case 2:
            return @"周一";
            break;
        case 3:
            return @"周二";
            break;
        case 4:
            return @"周三";
            break;
        case 5:
            return @"周四";
            break;
        case 6:
            return @"周五";
            break;
        case 7:
            return @"周六";
            break;
        default:
            return @"周一";
            break;
    }
}

#pragma mark -
#pragma mark 计算睡眠结束时间（根据睡眠报告开始时间和睡眠报告长度）
+(NSString *)getReportEndTime
{
    NSString *currenTime = [[NSString alloc] init];
    UserConfig *config = [UserConfig sharingUserConfig];
    currenTime =[config getReportStartTime];//获取报告开始的时间
    NSRange range = [currenTime rangeOfString:@":"];
    int currentHour = [[currenTime substringToIndex:range.location] intValue];//时
    int currentMinute  = [[currenTime substringFromIndex:range.location +1] intValue];//分
    
    int HourSec1 =  currentHour*3600;
    int MinuteSec1 = currentMinute*60;
    int currentSec = HourSec1 + MinuteSec1;//当前的秒
   
    int lengthReport = (int)[config getSleep].length;//睡眠报告长度
    int currentTimen1  = lengthReport*30;//对应的睡眠阶段
    currentSec = currentTimen1 + currentSec;
    if (currentSec > 86400)
    {//如果超过了24点
        currentSec = currentSec - 86400;
    }
    int hour = currentSec/3600;
    int minute = (currentSec%3600)/60;
    NSString * hourMinute = [[NSString alloc] initWithFormat:@"%d:%d",hour,minute];
    return hourMinute;
}

#pragma mark -
#pragma mark 根据用户总得分，计算用户等级
+(NSString *)getGrade:(NSString *)totalGrade
{
    double index = [totalGrade doubleValue];
    NSString * stringGrade;
    if (index <= 300)
    {
        stringGrade = @"Lv1";
    }
    else if (index <= 800)
    {
        stringGrade = @"Lv2";
    }
    else if (index <= 1500)
    {
        stringGrade = @"Lv3";
    }
    else if (index <= 3000)
    {
        stringGrade = @"Lv4";
    }
    else if (index <= 5000)
    {
        stringGrade = @"Lv5";
    }
    else
    {
        stringGrade = @"Lv6";
    }
    return stringGrade;
}
@end
